/*
 * @Author: weidewei
 * @Date: 2025-10-29 17:18:53
 * @LastEditors: weidewei
 * @LastEditTime: 2025-10-31 17:24:55
 * @Description:
 * @FilePath: \2025-front-face\js\test.js
 */
// 变量提升：不管在不在块级作用域，只要用了var声明，就会有变量提升
// var x = 1;
// function test() {
//   console.log(x);
//   // if (false) {
//   //   var x = 2;
//   //   function foo() {}
//   // }
//   console.log(x);
//   console.log(typeof foo); // "undefined"
// }
// test();

// console.log(x); // 1
// var b = 9;
// function fn() {
//   if (false) {
//     var b = 78;
//     function bb() {}
//   }
//   console.log(b);
// }

// fn();

// // 这段代码等价于上面那段代码
// function fn() {
//   var b; // 提升到这里，b = undefined
//   if (false) {
//     b = 78; // 这行不会执行
//   }
//   console.log(b); // undefined
// }

// // ​​ES6类的默认严格模式​​：ES6类（class）的代码块​​默认在严格模式下执行​​（无需手动写'use strict'），严格模式的默认绑定​​：严格模式下，独立函数调用的this会指向undefined（而非非严格模式的全局对象window）。
// class Person {
//   constructor(name) {
//     console.log("this", this);
//     this.name = name;
//   }
//   greet() {
//     console.log(`Hello, ${this.name}`); // 问题8：输出什么？为什么？
//   }
// }
// const alice1 = new Person("Alice");
// const greet = alice1.greet; // 把类实例的方法赋值给变量
// // greet(); // 单独调用这个函数 Hello,undefined   错 答案：报错了

// console.log("===============");

// // ("use strict");
// //   const obj12 = {
// //     name: "Alice",
// //     sayHi: function () {
// //       console.log(this.name); // 报错
// //     },
// //   };
// //   const hi = obj12.sayHi;
// //   hi(); // 输出什么？

// const globalObj = {
//   name: "Global",
//   inner: {
//     name: "Inner",
//     say: () => console.log(this.name), // 箭头函数定义在 globalObj 内部吗？
//   },
// };
// globalObj.inner.say();

// const globalObj1 = {
//   name: "Global",
//   inner: {
//     name: "Inner",
//     // 普通函数方法
//     regularSay: function () {
//       console.log(`普通函数：${this.name}`);
//     },
//     // 箭头函数方法
//     arrowSay: () => {
//       console.log(`箭头函数：${this.name}`);
//     },
//   },
// };

// // 场景1：直接作为内层对象的方法调用
// globalObj1.inner.regularSay(); // 输出什么？Inner
// globalObj1.inner.arrowSay(); // 输出什么？undefined

// // 场景2：将方法赋值给全局变量后单独调用
// const tempRegular = globalObj1.inner.regularSay;
// const tempArrow = globalObj1.inner.arrowSay;
// tempRegular(); // 输出什么？undefined
// tempArrow(); // 输出什么？undefined

// console.log("start");

// setTimeout(() => console.log("timeout"), 0);
// Promise.resolve().then(() => console.log("promise"));
// process.nextTick(() => console.log("nextTick"));

// console.log("end");

// console.log("1");

// setTimeout(() => {
//   console.log("2");
//   Promise.resolve().then(() => console.log("3"));
// }, 0);

// Promise.resolve().then(() => {
//   console.log("4");
//   setTimeout(() => console.log("5"));
// }, 0);

// console.log("6");

console.log("start");

setImmediate(() => console.log("immediate"));
process.nextTick(() => console.log("nextTick"));
setTimeout(() => console.log("timeout"), 0);

console.log("end");
